home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / DEB / DPMI.C < prev    next >
C/C++ Source or Header  |  1994-05-27  |  7KB  |  269 lines

  1. /*
  2. ** DPMI services for GNU_C
  3. **
  4. ** (c) Rainer Schnitker 1994
  5. */
  6.  
  7. #include <stdio.h>
  8.  
  9. #define INLINE static inline
  10.  
  11. typedef unsigned char   BYTE;
  12. typedef unsigned short    WORD;
  13. typedef unsigned long   DWORD;
  14.  
  15. typedef struct {
  16.     WORD lim_lo;
  17.     WORD base_lo;
  18.     BYTE base_mi,access,lim_hi,base_hi;
  19. } DESCRIPTOR ;
  20. typedef DESCRIPTOR *PDESCRIPTOR;
  21.  
  22. typedef struct { DWORD LargestFree;
  23.                  DWORD MaxUnlockedPages;
  24.                  DWORD MaxLockedPages;
  25.                  DWORD AddressSpacePages;
  26.                  DWORD UnlockedPages;
  27.                  DWORD UnusedPages;
  28.                  DWORD PhysicalPages;
  29.                  DWORD FreeAddressSpacePages;
  30.                  DWORD PagingFilePages;  /* or partition size */
  31.                  DWORD reserved[3];
  32.                } FREEMEMINFO ;
  33. typedef FREEMEMINFO *PFREEMEMINFO;
  34.  
  35. /* descriptor makros */
  36. #define DESC_BASE(d)  (((((DWORD)d.base_hi<<8)|(DWORD)d.base_mi)<<16)|(DWORD)d.base_lo)
  37. #define DESC_LIMIT(d) ((((DWORD)(d.lim_hi&15))<<16)|(DWORD)d.lim_lo)
  38. #define GATE_OFFSET(d) (((((DWORD)d.base_hi<<8)|(DWORD)d.lim_hi)<<16)|(DWORD)d.lim_lo)
  39.  
  40. /* descriptor fields */
  41. #define ACCESS_BIT              1
  42. #define READ_BIT                2
  43. #define WRITE_BIT               2
  44. #define CONFIRMING_BIT          4
  45. #define EXPAND_BIT              4
  46. #define CODE_BIT                8
  47. #define SEGMENT_BIT             16
  48. #define PRESENT_BIT             128
  49. #define AVL_BIT                 16
  50. #define DEFAULT_BIT             64
  51. #define BIG_BIT                 64
  52. #define GRANULAR_BIT            128
  53. #define DPL_MASK                96
  54. #define TYPE_MASK               15
  55. #define LIMIT_HI_MASK           15
  56.  
  57. #define APP_CODE_SEL            250   /* dpl=3 , read */
  58. #define APP_DATA_SEL            242   /* dpl=3 ,write */
  59.  
  60. #define TYPE_CODE               10
  61. #define TYPE_CONFIRM_CODE       14
  62. #define TYPE_DATA               2
  63. #define TYPE_EXPAND_DATA        6
  64. #define TYPE_286TSS             1
  65. #define TYPE_LDT                2
  66. #define TYPE_BUSY286TSS         3
  67. #define TYPE_286CALLGATE        4
  68. #define TYPE_TASKGATE           5
  69. #define TYPE_286INTGATE         6
  70. #define TYPE_286TRAPGATE        7
  71. #define TYPE_386TSS             9
  72. #define TYPE_BUSY386TSS         11
  73. #define TYPE_386CALLGATE        12
  74. #define TYPE_386INTGATE         14
  75. #define TYPE_386TRAPGATE        15
  76.  
  77. /* breakpoints-types */
  78. #define BREAK_CODE              0x0001
  79. #define BREAK_DATA_W1           0x0101
  80. #define BREAK_DATA_RW1          0x0201
  81. #define BREAK_DATA_W2           0x0102
  82. #define BREAK_DATA_RW2          0x0202
  83. #define BREAK_DATA_W4           0x0104
  84. #define BREAK_DATA_RW4          0x0204
  85.  
  86.  
  87. #define CHECKERR "jnc    1f\n\tmovl   $-1, %0 \n\tjmp    2f \n\t1: \n\t"
  88. #define CHECK_ERR_DPMI10 "jc    2f\n\t"
  89. #define OKEAX0 "xorl   %0, %0 \n\t2: \n\t"
  90.  
  91. INLINE int GetDescriptor(int sel, DESCRIPTOR *desc)
  92. {
  93.     register int _v;
  94.  
  95.     __asm__ __volatile__(
  96.     "int    $0x31 \n\t"
  97.         CHECKERR
  98.     OKEAX0
  99.     : "=r" (_v)
  100.     : "b" (sel) , "D" ((long)desc) , "a" (0x0B)
  101.     );
  102.  
  103.     return _v ;
  104. }
  105.  
  106. INLINE int GetFreeMemInfo(FREEMEMINFO *info)
  107. {
  108.     register int _v;
  109.  
  110.     __asm__ __volatile__(
  111.     "int    $0x31 \n\t"
  112.     CHECKERR
  113.     OKEAX0
  114.     : "=r" (_v)
  115.     : "D" ((long)info), "a" (0x500)
  116.     );
  117.  
  118.     return _v ;
  119. }
  120.  
  121. int is_emx_exe(void)
  122. {
  123.     register int ver;
  124.  
  125. #ifdef __EMX__
  126.     /* os_version() uses ebx */
  127.     __asm__ ("pushl  %ebx \n\t");
  128.     ver = __os_version();
  129.     __asm__ ("popl   %ebx \n\t");
  130. #else
  131.     __asm__ __volatile__(
  132.     "movb   $0x30, %%ah \n\t"
  133.     "int    $0x21 \n\t"
  134.         : "=a" (ver)
  135.         :
  136.         : "ax","bx");
  137. #endif
  138.  
  139.     /* EMX set high eax to "em" */
  140.     if (ver >> 16 == 0x6d65)
  141.     return 1;
  142.     else
  143.     return 0;
  144. }
  145.  
  146. void PrintFreeMemInfo()
  147. {
  148.     FREEMEMINFO fmi;
  149.     FREEMEMINFO *fm = &fmi;
  150.  
  151.     if (is_emx_exe()) {
  152.     puts("emx is running; no DPMI services");
  153.     return;
  154.     }
  155.  
  156.     if (GetFreeMemInfo(fm))
  157.     return;
  158.  
  159.     printf("Largest available block           : %lu Bytes = %lu KB\n",
  160.        fm->LargestFree, fm->LargestFree >> 10);
  161.     printf("Number free pages                 : %4lu = %4lu KB\n"
  162.        ,fm->MaxUnlockedPages, fm->MaxUnlockedPages * 4);
  163.     printf("Number free pages to lock         : %4lu = %4lu KB\n"
  164.        ,fm->MaxLockedPages, fm->MaxLockedPages * 4);
  165.     printf("Number pages of linear addr space : %4lu = %4lu KB\n"
  166.        ,fm->AddressSpacePages, fm->AddressSpacePages * 4);
  167.     printf("Number pages not locked           : %4lu = %4lu KB\n"
  168.        ,fm->UnlockedPages, fm->UnlockedPages * 4);
  169.     printf("Number pages not used             : %4lu = %4lu KB\n"
  170.        ,fm->UnusedPages, fm->UnusedPages * 4);
  171.     printf("Number pages managed by the Dpmi  : %4lu = %4lu KB\n"
  172.        ,fm->PhysicalPages, fm->PhysicalPages * 4);
  173.     printf("Number pages free addr space      : %4lu = %4lu KB\n"
  174.        ,fm->FreeAddressSpacePages, fm->FreeAddressSpacePages * 4);
  175.  
  176.     if (fm->PagingFilePages <= 0xFFFFFL)
  177.     printf("Number pages in swapfile          : %4lu = %4lu KB\n"
  178.            ,fm->PagingFilePages, fm->PagingFilePages * 4);
  179.     else
  180.     printf("DPMI host paging partition        : %lu Bytes = %lu MB\n"
  181.            ,fm->PagingFilePages, fm->PagingFilePages >> 20);
  182. }
  183.  
  184. static void PrintDescriptor(DESCRIPTOR *d)
  185. {
  186.     BYTE flag;
  187.  
  188.     if (!(d->access & PRESENT_BIT)) {
  189.     printf("Not Present\n");
  190.     return;
  191.     }
  192.     if (d->access & SEGMENT_BIT)/* code or data selector */
  193.     printf("Base=%02X%02X%04X Limit=%01X%04X %s DPL=%u %s %s %s %s\n",
  194.            d->base_hi, d->base_mi, d->base_lo,
  195.            d->lim_hi & LIMIT_HI_MASK, d->lim_lo,
  196.            (d->lim_hi & GRANULAR_BIT) ? "Pages" : "Bytes",
  197.            (d->access & DPL_MASK) >> 5,
  198.            (d->lim_hi & DEFAULT_BIT) ? "32bit" : "16bit",
  199.            (d->access & CODE_BIT) ?
  200.            (d->access & CONFIRMING_BIT) ? "CONF" : "CODE" :
  201.            (d->access & EXPAND_BIT) ? "EXPD" : "DATA",
  202.            (d->access & WRITE_BIT) ?
  203.            (d->access & CODE_BIT) ? "R" : "W" : "-",
  204.            (d->access & ACCESS_BIT) ? "ACC" : " ");
  205.  
  206.     else {            /* system selector */
  207.     flag = d->access & (BYTE) 7;
  208.     switch (flag) {
  209.     case 0:
  210.         break;
  211.     case 1:
  212.         printf("TSS%s ", (d->access & 8) ? "386" : "286");
  213.         break;
  214.     case 2:
  215.         printf("LDT ");
  216.         break;
  217.     case 3:
  218.         printf("BUSYTSS%s ", (d->access & 8) ? "386" : "286");
  219.         break;
  220.     case 4:
  221.         printf("CALLGATE%s ", (d->access & 8) ? "386" : "286");
  222.         break;
  223.     case 5:
  224.         printf("TASKGATE ");
  225.         break;
  226.     case 6:
  227.         printf("INT_GATE%s ", (d->access & 8) ? "386" : "286");
  228.         break;
  229.     case 7:
  230.         printf("TRAPGATE%s ", (d->access & 8) ? "386" : "286");
  231.         break;
  232.     }
  233.  
  234.  
  235.     if (flag <= 3) {
  236.         printf("Base=%02X%02X%04X Limit=%01X%04X DPL=%u\n",
  237.            d->base_hi, d->base_mi, d->base_lo,
  238.            d->lim_hi & LIMIT_HI_MASK, d->lim_lo,
  239.            (d->access & DPL_MASK) >> 5);
  240.     } else {
  241.         printf("Sel=%04X Offset=%02X%02X%04X DPL=%u\n",
  242.            d->base_lo,
  243.            d->base_hi, d->lim_hi, d->lim_lo,
  244.            (d->access & DPL_MASK) >> 5);
  245.     }
  246.     }                /* else system descriptor */
  247. }
  248.  
  249. void show_descriptor(int sel, int number)
  250. {
  251.     DESCRIPTOR desc;
  252.     int i;
  253.  
  254.     if (is_emx_exe()) {
  255.     puts("emx is running; no DPMI services");
  256.     return;
  257.     }
  258.  
  259.     for (i = 1; i <= number; i++) {
  260.     printf("sel %X: ", sel);
  261.     if (GetDescriptor(sel, &desc)) {
  262.         printf("- invalid -\n");
  263.         break;
  264.     }
  265.     PrintDescriptor(&desc);
  266.     sel += 8;
  267.     }
  268. }
  269.